﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace bll
{
    public class clsUserCollection
    {
        string _databaseFile;   // String zur Access-Datei, wird im Konstruktor initialisiert
 
        /// <summary>
        /// User-Collection Konstruktor 
        /// </summary>
        public clsUserCollection() 
        {   
            // hier wird der Pfad zur Access-Datei aus web.config gelesen
            _databaseFile = System.Configuration.ConfigurationManager.AppSettings["AccessFileName"];
        }

        /// <summary>
        /// Liest alle User aus der DB und gibt sie als Liste zurück
        /// </summary>
        /// <returns></returns>
        public List<clsUser> getAllUsers()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllUsers");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsUser> _myUserList = new List<clsUser>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsUser _myUser = new clsUser();
                //und hier die Daten nach Index
                _myUser.ID = (int)_dr["UID"];
                _myUser.Name = (String)_dr["UName"];
                _myUser.Address = (String)_dr["UAddress"];
                _myUser.Active = (bool)_dr["UActive"];
                _myUserList.Add(_myUser);
            }
            return _myUserList;
        } //getAllUsers() 

        /// <summary>
        /// Update eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls Update erfolgreich </returns>
        public int UpdateUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Access-Query)
            _myProvider.AddParam("Name", _User.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Address", _User.Address, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Active", _User.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);
            _myProvider.AddParam("ID", _User.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserUpdateById");

            return _changedSets;
        } //updateUser()

        /// <summary>
        /// Löschen eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls delete erfolgreich </returns>
        public int DeleteUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Übergabeparameter ID hinzufügen 
            _myProvider.AddParam("ID", _User.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserDeleteById");

            return _changedSets;
        } //deleteUser()

        /// <summary>
        /// Insert eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt</param>
        /// <returns>1 falls Insert erfolgreich </returns>
        public int InsertUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Acess-Query)
            _myProvider.AddParam("Name", _User.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Address", _User.Address, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Active", _User.Active, DAL.DataDefinition.enumerators.SQLDataType.BOOL);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserInsert");

            return _changedSets;
        } //updateUser()

        /// <summary>
        /// Gibt User nach einer ID zurück
        /// </summary>
        /// <param name="_id">ID des gesuchten Users</param>
        /// <returns>User-Objektt (oder NULL) </returns>
        public clsUser GetUserById(int _id)
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", _id, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetUserById");

            //füllen wir eine DataTable mit dem DataSet
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            clsUser _myUser = new clsUser();
            _myUser.ID = (int)_dr["UID"];
            _myUser.Name = (String)_dr["UName"];
            _myUser.Address = (String)_dr["UAddress"];
            _myUser.Active = (bool)_dr["UActive"];

            return _myUser;
        } // getUserbyId()

        /// <summary>
        /// Zählt Anzahl users via SQL-Abfrage
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers1()
        {
            int _count;

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QCountUsers");

            //das Ergebnis von QCountUsers ist eine Tabelle mit einer Zeile und einer Spalte
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            _count = (int)_dr[0];

            return _count;
        } // CountUsers1()

        /// <summary>
        /// Zählt Anzahl Users, indem erst alle eingelesen werden und dann Länge der Liste zurückgegeben wird
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers2()
        {
            int _count;
            List<clsUser> _UserList;

            _UserList = getAllUsers();
            _count = _UserList.Count;

            return _count;
        } // CountUsers2()
    }
}
